#ifndef __SWEI_LOGSTEP_H
#define __SWEI_LOGSTEP_H

#include "task/service/include/swei_common.h"
#include "utils/utils_timer.h"

#ifdef __cplusplus
extern "C" {
#endif

#define NET_TIMEOUT_INTERVAL (120 * 1000)        /*!< 网络连接超时 */
#define SOCK_TIMEOUT_INTERVAL (120 * 1000)       /*!< 套接字连接超时 */

typedef enum {
    LOGSTEP_IDLE,               /*!< 空闲状态 */
    LOGSTEP_WAIT_NETWORK,       /*!< NETWORK管理和状态检查 */
    LOGSTEP_WAIT_SOCKET,        /*!< SOCKET管理和状态检查 */
    LOGSTEP_LOGIN,              /*!< 登录报文 */
    LOGSTEP_LOGIN_ACK,          /*!< 登录报文响应 */
    LOGSTEP_ACTIVE,             /*!< 查询激活状态 */
    LOGSTEP_ACTIVE_ACK,         /*!< 查询激活状态响应 */
    LOGSTEP_ACTIVE_WAIT,        /*!< 等待服务器回应激活状态 */
    LOGSTEP_HBT,                /*!< 心跳报文 */
    LOGSTEP_HBT_ACK,            /*!< 心跳报文响应 */
    LOGSTEP_HBT_WAIT,           /*!< 定时等待心跳包发送 */
}log_step_e;

typedef struct {
    bool            need_poweron_act_check;     /* @todo 和active状态重叠，考虑优化只保留一个 */
    uint8_t         step;                       /* 当前登录步骤 */
    uint8_t         ack;                        /* 响应状态 */
    uint8_t         login_rdy;                  /* 登录正常标志 */
    uint8_t         active_req_finish;          /* 服务器是否响应激活状态, true-完成 */
    uint8_t         heartbeat_rdy;              /* 心跳正常标志 */
    uint32_t        retry;                      /* 重试次数 */
    utils_time_t    timer;                      /* 超时计时器 */
    utils_time_t    allow_sleep_timer;
}login_ctx_t;

void swei_login_init(void);
void swei_login_process(void);
void swei_login_deinit(void);

/// @brief 查询登录状态
/// @param  
/// @return true - 登录正常 false - 未登录
bool swei_login_is_ok(void);

/// @brief 查询心跳状态
/// @param  
/// @return true - 心跳正常 false - 心跳异常
bool swei_heartbeat_is_ok(void);

/// @brief 登录流程完成判断
/// @param  
/// @return 
bool swei_login_finish(void);

/// @brief 查询允许低功耗状态
/// @brief 查询允许低功耗状态
/// @param  
/// @return 
bool swei_login_lowpower_allow(void);

// @todo: 后续改成register callback方式
void swei_srv_login_ack_set(void);

/**
 * @brief 网络状态检查
 * @return true 
 * @return false 
 */
bool net_ready_check(void);
/**
 * @brief socket状态是否正常
 * @return true 
 * @return false 
 */
bool socket_ready_check(void);

/// @brief 登录超时判断
/// @param  
/// @return 
bool swei_login_timeout(void);

/// @brief 心跳发送中判断
/// @param  
/// @return 
bool swei_login_heartbeat_is_sending(void);

/// @brief 获取下次心跳上报时间
#define swei_hbt_next_rpt_time_get get_heartbeat_report_next_send
uint32_t get_heartbeat_report_next_send(void);

/// @brief 获取当前登录流程
/// @param  
/// @return 
uint8_t swei_login_step_get(void);
/// @brief 获取当前登录流程
/// @param  
/// @return 
const char *swei_login_step_get_str(void);

/// @brief 获取当前激活应答是否成功
/// @param
/// @return
bool swei_srv_active_req_finish(void);

/// @brief 服务器响应激活状态更新
/// @param
/// @return
void swei_srv_active_req_set_finish(void);

/**
 * @brief Get the heartbeat total timecnt object
 * @return uint32_t 
 */
uint32_t get_heartbeat_total_timecnt(void);


#ifdef __cplusplus
}
#endif

#endif